/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package factoryTotal;

import Estats.EstatFinalPantalla;
import Estats.EstatMuerte;
import newMenu.ManagerPerfil;
import newMenu.ManagerRecursos;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.state.BasicGameState;
import org.newdawn.slick.state.StateBasedGame;
import org.newdawn.slick.Color;

/**
 *
 * @author wida46984148
 */
public class EstatJuego1 extends BasicGameState {
    public static final int ID = 24;
    //static String[] oleadaEnemigos = {"nave0","nave1","nave2A","boss1"};
    static String[] oleadaEnemigos = {"nave2A","nave1","nave2A","nave1","nave0C","nave2A","nave1","nave2A","nave1","nave0C","nave0D","descanso","descanso","descanso","descanso","boss1"};
    NaveBase naveBaseW = null;
    Image imatgeFons;
    StateBasedGame state;
    ElementosJuego ej = new ElementosJuego();
    float x = 350; // en original 800x600
    float y = 800;
    float ifm = -1200;  //Imagen Fondo Movimiento
    float velocidad;
    int puntuacion = 0;
    int nivel;
    int contador;
    int disparosC = 0;      //contador de disparos realizados
    int auxCnt = 0;     //contador auxiliar
    boolean nivelFin = false;
    boolean enemigo = true;
    boolean disponibleBombas = true;


    public void init(GameContainer container, StateBasedGame game) throws SlickException {
        this.state = game;
        imatgeFons = ManagerRecursos.getImage("fondoNivel2Image");// new Image("src/data/superLand3.png");
    }

    public void update(GameContainer gc, StateBasedGame game, int delta) throws SlickException {
        Input input = gc.getInput();

        if (naveBaseW.pY > 648) {
            naveBaseW.pY -= 5;
            naveBaseW.posicion(naveBaseW.pX, naveBaseW.pY);
        }

        if (!(naveBaseW.destruido)) {
            if (nivelFin) {
                if (naveBaseW.pY > -150) {
                    naveBaseW.pY -= 5;
                    naveBaseW.posicion(naveBaseW.pX, naveBaseW.pY);
                } else {
                    guardar();
                    game.enterState(EstatFinalPantalla.ID);//game.enterState(9);
                }
            } else {
                if (naveBaseW.pY > 648) {
                    naveBaseW.pY -= 5;
                    naveBaseW.posicion(naveBaseW.pX, naveBaseW.pY);
                }
                if (input.isKeyDown(Input.KEY_LEFT)) {
                    float auxX = naveBaseW.pX;
                    naveBaseW.pX += -velocidad * delta;
                    if (naveBaseW.pX <= -30) {
                        naveBaseW.pX = auxX;
                    }
                    naveBaseW.posicion(naveBaseW.pX, naveBaseW.pY);
                }

                if (input.isKeyDown(Input.KEY_RIGHT)) {
                    float auxX = naveBaseW.pX;
                    naveBaseW.pX += velocidad * delta;
                    if (924 <= naveBaseW.pX) {
                        naveBaseW.pX = auxX;
                    }
                    naveBaseW.posicion(naveBaseW.pX, naveBaseW.pY);
                }
                if (input.isKeyDown(Input.KEY_DOWN)) {
                    float hip = velocidad * delta;
                    float auxY = naveBaseW.pY;
                    x += hip * java.lang.Math.sin(java.lang.Math.toRadians(0.0));
                    naveBaseW.pY += hip * java.lang.Math.cos(java.lang.Math.toRadians(0.0));
                    if (648 <= naveBaseW.pY) {
                        naveBaseW.pY = auxY;
                    }
                    naveBaseW.posicion(naveBaseW.pX, naveBaseW.pY);
                }

                if (input.isKeyDown(Input.KEY_UP)) {
                    float hip = velocidad * delta;
                    float auxY = naveBaseW.pY;
                    naveBaseW.pX += hip * java.lang.Math.sin(java.lang.Math.toRadians(0.0));
                    naveBaseW.pY -= hip * java.lang.Math.cos(java.lang.Math.toRadians(0.0));
                    if (naveBaseW.pY <= 45) {
                        naveBaseW.pY = auxY;
                    }
                    naveBaseW.posicion(naveBaseW.pX, naveBaseW.pY);
                }
                if ((int) java.lang.Math.sin(java.lang.Math.toRadians(contador)) == 1 || (int) java.lang.Math.sin(java.lang.Math.toRadians(contador)) == -1) {
                    oleadaEnemigos(1);
                }
                contador += 2;
                if (input.isKeyPressed(Input.KEY_SPACE)) {
                    disparosC++;
                    Disparo ms = null;
                    ms = naveBaseW.getDisparo();
                    ej.posicionDisparo(naveBaseW.pX + 58, naveBaseW.pY, ms);
                }
                if(disponibleBombas){
                    if (input.isKeyPressed(Input.KEY_ENTER)) {
                        DisparoBomba ms = null;
                        NaveWida nw = (NaveWida) naveBaseW;
                        ms = (DisparoBomba) nw.getBomb();
                        ej.posicionDisparo(naveBaseW.pX + 58, naveBaseW.pY, ms);
                        ms.setRango(naveBaseW.pY);
                        nw.setBombasDisponibles(1);
                        disponibleBombas = nw.isDisponeBombas();
                    }
                }
            }
        } else {
            naveBaseW.posicion(1000, 1000);
            game.enterState(EstatMuerte.ID);
        }
        ej.update(delta);
        ifm = ifm != 0 ? ifm += 0.5 : 0;
        //System.out.println(ifm);
    }

    public void oleadaEnemigos(int x) {
        if (auxCnt < oleadaEnemigos.length) {
            ej.posicionaUnitatEnemiga(oleadaEnemigos[auxCnt]);
            auxCnt += x;
        } else {
            nivelFin = ej.getBoss().destruido;
        }
    }

    public void render(GameContainer gc, StateBasedGame game, Graphics g) throws SlickException {
        imatgeFons.draw(0, ifm);
        ej.dibujaElementos(g, gc);
        NaveWida nvW = (NaveWida) naveBaseW;
        estatNau(gc, game, g);
        g.drawString("Puntuacion: " + nvW.getPuntuancion(), 300, 10);
    }

    public void estatNau(GameContainer gc, StateBasedGame game, Graphics g) throws SlickException {
        NaveWida nvW = (NaveWida) naveBaseW;
        g.setColor(Color.darkGray);
        g.fillRect(0, 0, 1024, 40);
        nvW.renderVida(gc, g);
        nvW.renderVides(gc, g);
        nvW.renderBombas(gc, g);
    }

    public void guardar() {
        ManagerPerfil.setNivel(ManagerPerfil.getNivel() + 1);
        ManagerPerfil.setDisparosRealizados(disparosC);

        System.out.println("GURADAR!!!!!!!!!!!!!!!!!!");
    }

    @Override
    public void enter(GameContainer gc, StateBasedGame state) throws SlickException {
        nivel = ManagerPerfil.getNave();
        switch (nivel) {
            case 1:
                naveBaseW = FabricaNaves.naveWida("nave1");
                ej.posicionaUnitatAmiga(x, y, naveBaseW);
                velocidad = 0.6f;
                break;
            case 2:
                naveBaseW = FabricaNaves.naveWida("nave2");
                ej.posicionaUnitatAmiga(x, y, naveBaseW);
                velocidad = 0.3f;
                break;
            case 3:
                naveBaseW = FabricaNaves.naveWida("nave3");
                ej.posicionaUnitatAmiga(x, y, naveBaseW);
                velocidad = 0.4f;
                break;
        }
    }

    @Override
    public int getID() {
        return ID;

    }
}
